// ## 入口

// ### 引入库
// #### 框架
var express = require('express');
var session = require('express-session');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
// #### 其他
var favicon = require('serve-favicon');
var path = require('path');
var logger = require('morgan');
// #### 路由
var index = require('./routes/index');
var users = require('./routes/users');

// ### 框架初始化
var app = express();

// ### 跨域
app.all("*", function(req, res, next) {
  if ( !req.get("Origin") ) return next();

  res.set("Access-Control-Allow-Origin", "*"); // 请求源
  res.set("Access-Control-Allow-Methods", "GET"); // 请求类型
  res.set("Access-Control-Allow-Headers", "X-Requested-With, Content-Type"); // 请求头部
  // res.set('Access-Control-Allow-Max-Age', 3600);

  if ( "OPTIONS" === req.method ) return res.send(200);

  next();
});

// ### 模板引擎初始化
app.set('views', path.join(__dirname, 'views')); // 设置视图目录
app.set('view engine', 'ejs'); // 设置模板引擎

// ### 中间件挂载
// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); // favicon
app.use(logger('dev')); // morgan 日志
app.use(bodyParser.json()); // body
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser()); // cookie
app.use(express.static(path.join(__dirname, 'public'))); // 静态资源
app.use(session({ // express-session
  secret: '12345',
  cookie: {maxAge: 1000*60*60*24 },
  resave: false,
  saveUninitialized: true,
}));

// ### 路由
app.use('/', index);
app.use('/users', users);

app.use(function(req, res, next) { // 404
  var err = new Error('Not Found');
  err.status = 404;

  next(err);
});
app.use(function(err, req, res, next) { // 错误处理
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  res.status(err.status || 500);
  res.render('error');
});

// ### 导出应用
module.exports = app;
